#include "Sock.hpp"
#include <functional>
#include <vector>

using func_t = function<void(int)>;

class TcpServer;

struct Data
{
    Data(int sock, string cli_ip, uint16_t cli_port, TcpServer *server)
        : _sock(sock), _cli_ip(cli_ip), _cli_port(cli_port), _server(server)
    {
    }
    string _cli_ip;
    uint16_t _cli_port;
    int _sock;
    TcpServer *_server;
};

class TcpServer
{
public:
    static void *Routine(void *args) // 多线程服务器
    {
        pthread_detach(pthread_self()); // 让子线程被自动回收
        Data *td = (Data *)args;
        td->_server->Excute(td->_sock); // 业务逻辑
        close(td->_sock);
        cout << "close:" << td->_sock << endl;
        delete td;
        return nullptr;
    }

    TcpServer(uint16_t port = 8080, const string &ip = "0.0.0.0")
    {
        _listensock = _sock.Socket();
        _sock.Bind(_listensock, port, ip);
        _sock.Listen(_listensock);
        logMessage(NORMAL, "Tcp服务器启动成功"); // 创建+绑定+监听
    }

    void Excute(int sock) // 执行所有添加的服务
    {
        for (auto func : _funcs)
        {
            func(sock);
        }
    }

    void BindService(func_t func)
    {
        _funcs.push_back(func); // 添加服务
    }

    void Start()
    {
        while (true)
        {
            string cli_ip;
            uint16_t cli_port;
            int sock = _sock.Accept(_listensock, &cli_ip, &cli_port);
            if (sock == -1)
                continue;
            logMessage(NORMAL, "获取连接成功,server_sock:%d", sock);
            // v3:多线程服务器
            pthread_t tid;
            pthread_create(&tid, NULL, Routine, (void *)new Data(sock, cli_ip, cli_port, this));
            // 子线程分离，不需要join
        }
    }

    ~TcpServer()
    {
        if (_listensock > 0)
            close(_listensock);
    }

private:
    int _listensock;       // 监听套接字
    Sock _sock;            // Socket编程
    vector<func_t> _funcs; // 服务器提供的服务
};